<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Lua</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Lua"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Lua rootpage-Lua skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Lua</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr">
<table class="float-right infobox toccolours toptextcells" style="font-size:90%; margin-top:0; width:21em;">
<tbody><tr>
<th colspan="2" class="hintergrundfarbe6" style="font-size:larger;">Lua
</th></tr>
<tr>
<td colspan="2" class="notheme" style="text-align:center; background-color:#f8f9fa;"><span typeof="mw:File"></span>
</td></tr>
<tr>
<th colspan="2" class="hintergrundfarbe5" style="font-size:105%; text-align:center;">Basisdaten
</th></tr>
<tr>
<td><b><a href="Programmierparadigma" title="Programmierparadigma">Paradigmen</a>:</b>
</td>
<td><a href="Skriptsprache" title="Skriptsprache">Skriptsprache</a>, <a href="Imperative_Programmierung" title="Imperative Programmierung">imperativ</a>, <a href="Funktionale_Programmierung" title="Funktionale Programmierung">funktional</a>
</td></tr>
<tr>
<td><b>Erscheinungsjahr:</b>
</td>
<td>1993
</td></tr>
<tr>
<td><b>Designer:</b>
</td>
<td><span class="wikidata-content">Roberto Ierusalimschy</span>
</td></tr>
<tr>
<td><b>Entwickler:</b>
</td>
<td>Roberto Ierusalimschy,<br>Waldemar Celes,<br>Luiz Henrique de Figueiredo
</td></tr>
<tr>
<td><b>Aktuelle <a href="Version_(Software)" title="Version (Software)">Version</a></b>
</td>
<td class="wikidata-content" style="white-space:nowrap;">5.5<sup id="cite_ref-_a8e36a3f095fbfbe_1-0" class="reference"><a href="#cite_note-_a8e36a3f095fbfbe-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> <small>(22. Dezember 2025)</small>
</td></tr>
<tr>
<td><b><a href="Typisierung_(Informatik)" title="Typisierung (Informatik)">Typisierung</a>:</b>
</td>
<td>dynamisch, schwach (<span lang="en">weak typing</span>)
</td></tr>
<tr>
<td><b>Wichtige <a href="Implementierung" title="Implementierung">Implementierungen</a>:</b>
</td>
<td><b>Lua</b>, LuaJIT<sup id="cite_ref-LuaJIT_2-0" class="reference"><a href="#cite_note-LuaJIT-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>, LLVM-Lua<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>, LuaCLR<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</td></tr>
<tr>
<td><b>Dialekte:</b>
</td>
<td>Metalua, Idle, GSL Shell
</td></tr>
<tr>
<td><b>Beeinflusst von:</b>
</td>
<td><a href="C%2B%2B" title="C++">C++</a>, <a href="CLU_(Programmiersprache)" title="CLU (Programmiersprache)">CLU</a>, <a href="Modula-2" title="Modula-2">Modula-2</a>, <a href="Scheme" title="Scheme">Scheme</a>, <a href="SNOBOL" class="mw-redirect" title="SNOBOL">SNOBOL</a>
</td></tr>
<tr>
<td><b>Beeinflusste:</b>
</td>
<td>Falcon, GameMonkey, <a href="Io_(Programmiersprache)" title="Io (Programmiersprache)">Io</a>, <a href="JavaScript" title="JavaScript">JavaScript</a>, <a href="Julia_(Programmiersprache)" title="Julia (Programmiersprache)">Julia</a>, MiniD, MoonScript, Red, <a href="Ruby_(Programmiersprache)" title="Ruby (Programmiersprache)">Ruby</a>, <a href="Squirrel_(Programmiersprache)" title="Squirrel (Programmiersprache)">Squirrel</a>
</td></tr>
<tr>
<td><b><a href="Betriebssystem" title="Betriebssystem">Betriebssystem</a>:</b>
</td>
<td><a href="Plattformunabh%C3%A4ngigkeit" title="Plattformunabhängigkeit">plattformunabhängig</a>
</td></tr>
<tr>
<td><b><a href="Lizenz" title="Lizenz">Lizenz</a>:</b>
</td>
<td><a href="MIT-Lizenz" title="MIT-Lizenz">MIT-Lizenz</a>
</td></tr>
<tr>
<td colspan="2" class="hintergrundfarbe5" style="text-align:center;"><a rel="nofollow" class="external text" href="https://www.lua.org/">www.lua.org</a>
</td></tr></tbody></table>
<p><b>Lua</b> (<a href="Portugiesische_Sprache" title="Portugiesische Sprache">portugiesisch</a> für <i><a href="Mond" title="Mond">Mond</a></i>) ist eine <a href="Imperative_Programmierung" title="Imperative Programmierung">imperative</a> und erweiterbare <a href="Skriptsprache" title="Skriptsprache">Skriptsprache</a> zum Einbinden in <a href="Computerprogramm" title="Computerprogramm">Programme</a>, um diese leichter weiterentwickeln und warten zu können. Eine der besonderen Eigenschaften von Lua ist die geringe Größe des <a href="Compiler" title="Compiler">kompilierten</a> Skript-<a href="Interpreter" title="Interpreter">Interpreters</a>.
</p><p>Lua-Programme sind meist <a href="Plattformunabh%C3%A4ngigkeit" title="Plattformunabhängigkeit">plattformunabhängig</a> und werden vor der Ausführung in <a href="Bytecode" title="Bytecode">Bytecode</a> übersetzt. Lua ist vorrangig als eingebettete Skriptsprache für andere Programme konzipiert, aber man kann auch eigenständige Programme schreiben. In dieser Hinsicht ist sie mit <a href="Tcl" title="Tcl">Tcl</a> vergleichbar. Vorteile von Lua sind die geringe Größe von 120 kB, die Erweiterbarkeit und die hohe Geschwindigkeit, verglichen mit anderen Skriptsprachen.
</p><p>Der Lua-Interpreter kann über eine <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>-<a href="Programmbibliothek" title="Programmbibliothek">Bibliothek</a> angesprochen werden, die auch ein <a href="Programmierschnittstelle" title="Programmierschnittstelle">API</a> für die <a href="Laufzeitumgebung" title="Laufzeitumgebung">Laufzeitumgebung</a> des Interpreters für Aufrufe vom C-Programm aus enthält. Mittels des API können verschiedene Teile des Programmes in C (oder C++) und Lua geschrieben werden, während Variablen und Funktionen in beiden Richtungen erreichbar bleiben (d. h. eine Funktion in Lua kann eine Funktion in C/C++ aufrufen und umgekehrt).
</p><p>Es gibt auch einen freien <a href="Just-in-time-Kompilierung" title="Just-in-time-Kompilierung">JIT-Compiler</a> namens LuaJIT, der die Revision 5.1 der Sprache unterstützt.<sup id="cite_ref-LuaJIT_2-1" class="reference"><a href="#cite_note-LuaJIT-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p><p>Lua ist in <a href="Varianten_der_Programmiersprache_C" title="Varianten der Programmiersprache C">ANSI-C</a> <a href="Implementierung#Softwaretechnik" title="Implementierung">implementiert</a> und unterstützt imperative und <a href="Funktionale_Programmierung" title="Funktionale Programmierung">funktionale</a> Programmierung. Implementiert man jedoch selbst Objekte mittels Metatables, wird auch <a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">objektorientierte Programmierung</a> möglich.
</p>
<div class="mw-heading mw-heading2"><h2 id="Geschichte">Geschichte</h2></div>
<p>Lua wurde 1993 von Roberto Ierusalimschy, Luiz Henrique de Figueiredo und Waldemar Celes in der <i>Computer Graphics Technology Group</i> der <a href="P%C3%A4pstliche_Katholische_Universit%C3%A4t_von_Rio_de_Janeiro" title="Päpstliche Katholische Universität von Rio de Janeiro">Päpstlichen Katholischen Universität von Rio de Janeiro</a> in <a href="Brasilien" title="Brasilien">Brasilien</a> entwickelt. Lua ist <a href="Freie_Software" title="Freie Software">freie Software</a> und wurde bis zur Version 4 unter einer eigenen <a href="BSD-Lizenz" title="BSD-Lizenz">BSD-Lizenz</a> veröffentlicht, ab Version 5 unter der <a href="MIT-Lizenz" title="MIT-Lizenz">MIT-Lizenz</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Verwendung">Verwendung</h2></div>
<p>Lua kann sowohl zum Verfassen eigenständiger Programme verwendet werden als auch als eingebettete Sprache dienen.
</p><p>Um einzelne Komponenten eines <a href="Computerspiel" title="Computerspiel">Computerspiels</a> wie z. B. Konfigurationsdateien oder die <a href="K%C3%BCnstliche_Intelligenz" title="Künstliche Intelligenz">KI</a> von <a href="Nicht-Spieler-Charakter" title="Nicht-Spieler-Charakter">computergesteuerten Charakteren</a> oder Gegnern von der <a href="Spiel-Engine" title="Spiel-Engine">Spiel-Engine</a> zu trennen, kommt Lua bei der Entwicklung von Computerspielen oft zum Einsatz. Dies macht die meist teuer entwickelte Spiel-Engine flexibler und ermöglicht eine mit geringerem Aufwand verbundene <a href="Wiederverwendbarkeit" title="Wiederverwendbarkeit">Wiederverwendbarkeit</a>, weshalb Lua im Bereich <a href="Propriet%C3%A4r" title="Proprietär">proprietärer</a> Spiele verwendet wird. Lua wird zum Beispiel in dem bekannten Spiel „<a href="Roblox" title="Roblox">Roblox</a>“ verwendet.
</p><p>Auch einige insbesondere dynamische und <a href="Tiling_(Computer)" title="Tiling (Computer)">Tiling</a>-<a href="Fenstermanager" title="Fenstermanager">Fenstermanager</a> nutzen Lua für Konfiguration und Steuerung, darunter <a href="Awesome_(Fenstermanager)" title="Awesome (Fenstermanager)">awesome</a><sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> und <a href="Ion_(Fenstermanager)" title="Ion (Fenstermanager)">Ion3</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Syntax">Syntax</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Datentypen">Datentypen</h3></div>
<p>Neben den Datentypen <a href="Nullwert" title="Nullwert">nil</a>, <a href="Boolesche_Variable" class="mw-redirect" title="Boolesche Variable">boolean</a>, number (mit den internen Subtypen <a href="Integer_(Datentyp)" title="Integer (Datentyp)">integer</a> und <a href="Gleitkommazahl" title="Gleitkommazahl">float</a>), <a href="Zeichenkette" title="Zeichenkette">string</a>, function, userdata und <a href="Koroutine" title="Koroutine">thread</a> kennt Lua als einzigen strukturierten <a href="Datentyp" title="Datentyp">Datentyp</a> table (Tabelle).
</p><p>Eine Tabelle ist ein <a href="Assoziatives_Datenfeld" class="mw-redirect" title="Assoziatives Datenfeld">assoziatives Datenfeld</a>, also eine Ansammlung von Schlüssel-Daten-Paaren. Der Schlüssel (Index) kann dabei jeden Datentyp (außer nil) besitzen. Weiterhin wird unterschieden zwischen dem Zahlenschlüssel 1 und dem Stringschlüssel „1“. Die Indizierung von Tabellen beginnt im Gegensatz zu Sprachen, die der <a href="C_(Programmiersprache)" title="C (Programmiersprache)">Programmiersprache C</a> ähnlich sind, mit 1.
</p><p>Zu den Tabellen gibt es in Lua auch metatable; diese sind table, die an einem Table gebunden sind. Jedoch kann man nicht einfach auf sie zugreifen, wenn man durch die Tabelle durchläuft. Metatable werden oft dafür verwendet, einen nicht vorhandenen Index des Tables zu liefern, z. B. Table = {[1] = "String", [2] = 13, [5] = true}. In dem Fall fehlt der Index 3 und 4. Wenn jetzt aber ein Metatable daran gebunden ist, können die Indexe 3 und 4 aus diesem verwendet werden. Das verhindert, dass Lua die <a href="Schleife_(Programmierung)" title="Schleife (Programmierung)">Schleife</a> abbricht. Ohne die Metatable würde hier der Index 5 einfach nicht mehr mit gelesen werden. Metatable können mit <i>setmetatable()</i> bearbeitet und erschaffen werden. Mit <i>getmetatable()</i> kann die Metatable in einer <a href="Variable_(Programmierung)" title="Variable (Programmierung)">Variable</a> gespeichert werden.
</p><p>Tabellen können auf folgende Weisen erzeugt werden:
</p>
<div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">T</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">-- Erzeugt eine leere Tabelle und weist sie der Variablen mit dem Namen T zu.</span>
<span class="nv">T</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="s2">"ja"</span><span class="p">,</span><span class="w"> </span><span class="s2">"nein"</span><span class="p">,</span><span class="w"> </span><span class="s2">"?"</span><span class="p">}</span><span class="w"> </span><span class="c1">-- Eine Tabelle mit 3 Elementen, wobei T[1] == "ja", T[2] == "nein" und T[3] == "?".</span>
<span class="nv">T</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{[</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"ja"</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"nein"</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"?"</span><span class="p">}</span><span class="w"> </span><span class="c1">-- Wie Zeile vorher, nur mit expliziter Indizierung.</span>
<span class="nv">T</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{[</span><span class="o">-</span><span class="mi">900</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="mi">900</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">}</span><span class="w"> </span><span class="c1">-- Tabelle mit 2 Elementen, aber unregelmäßigen Indizes.</span>
<span class="nv">T</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="nv">x</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="nv">y</span><span class="o">=</span><span class="mi">10</span><span class="p">}</span><span class="w"> </span><span class="c1">-- Typisches assoziatives Datenfeld mit T["x"], T["y"] (auch als T.x, T.y zugreifbar)</span>
<span class="nv">T</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="nv">x</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="nv">y</span><span class="o">=</span><span class="mi">10</span><span class="p">;</span><span class="w"> </span><span class="s2">"ja"</span><span class="p">,</span><span class="w"> </span><span class="s2">"nein"</span><span class="p">}</span><span class="w"> </span><span class="c1">-- Gemischte Tabelle mit T.x, T.y, T[1], T[2]</span>
<span class="nv">T</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="nv">Nachricht</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"wahl"</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="s2">"ja"</span><span class="p">,</span><span class="w"> </span><span class="s2">"nein"</span><span class="p">,</span><span class="w"> </span><span class="s2">"?"</span><span class="p">}}</span><span class="w"> </span><span class="c1">-- Tabellen können weitere Tabellen enthalten.</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Zuweisungen">Zuweisungen</h3></div>
<div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span>
<span class="nv">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"hi"</span>
<span class="kd">local</span><span class="w"> </span><span class="nv">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">a</span>
<span class="c1">-- Einfache Zuweisungen. Variablen sind nicht typisiert und können verschiedene Datentypen haben.</span>
<span class="c1">-- Lokale Variablen (definiert mit "local") sind auf den aktuellen Namensbereich beschränkt.</span>
<span class="nv">a</span><span class="p">,</span><span class="w"> </span><span class="nv">b</span><span class="p">,</span><span class="w"> </span><span class="nv">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="c1">-- Mehrfachzuweisungen sind erlaubt.</span>
<span class="nv">a</span><span class="p">,</span><span class="w"> </span><span class="nv">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">b</span><span class="p">,</span><span class="w"> </span><span class="nv">a</span><span class="w"> </span><span class="c1">-- Wertetausch: Anweisungen werden von rechts nach links ausgewertet.</span>
<span class="nv">a</span><span class="p">,</span><span class="w"> </span><span class="nv">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="s2">"6"</span><span class="w"> </span><span class="c1">-- Überflüssige Werte (Bsp: "6") werden ausgewertet, aber verworfen.</span>
<span class="nv">a</span><span class="p">,</span><span class="w"> </span><span class="nv">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"da"</span><span class="w"> </span><span class="c1">-- Fehlende Werte auf der rechten Seite werden mit "nil" ersetzt.</span>
<span class="nv">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="c1">-- Zerstört a. Der Speicherbereich von a wird vom Garbage-Collector freigegeben.</span>
<span class="nv">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">z</span><span class="w"> </span><span class="c1">-- Falls z nicht definiert ist, wird "nil" zugewiesen und somit a freigegeben.</span>
<span class="nv">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"3"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"2"</span><span class="w"> </span><span class="c1">-- Der Operator + erwartet Zahlen, die Zeichenketten werden also</span>
<span class="w"> </span><span class="c1">-- in Zahlen konvertiert, also erfolgt hier die Zuweisung a = 5.</span>
<span class="nv">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="c1">-- Der Verbindungsoperator erwartet Zeichenketten, die Zahlen werden</span>
<span class="w"> </span><span class="c1">-- konvertiert - a = "32".</span>
<span class="kd">local</span><span class="w"> </span><span class="nv">a</span><span class="w"> </span><span class="o"><</span><span class="nv">const</span><span class="o">></span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="c1">-- lexikalische (lokale) Konstanten wurden in Lua 5.4 eingeführt</span>
<span class="kd">local</span><span class="w"> </span><span class="nv">f</span><span class="w"> </span><span class="o"><</span><span class="nv">close</span><span class="o">></span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">io.open</span><span class="p">(</span><span class="nv">file</span><span class="p">)</span><span class="w"> </span><span class="c1">-- ebenfalls ab 5.4: to-close-Variablen mit ähnlicher Semantik</span>
<span class="w"> </span><span class="c1">-- wie Pythons Context Manager (with ...)</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Funktionen">Funktionen</h3></div>
<p>Funktionen können mit dem Schlüsselwort <code>function</code> erzeugt werden. Funktionen besitzen keine fixierte Anzahl an Parametern und Rückgabewerten.
</p>
<div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">function</span><span class="w"> </span><span class="nf">probe</span><span class="p">(</span><span class="nv">zahl1</span><span class="p">,</span><span class="w"> </span><span class="nv">zahl2</span><span class="p">,</span><span class="w"> </span><span class="nv">text</span><span class="p">,</span><span class="w"> </span><span class="nv">tabelle</span><span class="p">)</span>
<span class="w"> </span><span class="nv">zahl3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">zahl1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">zahl2</span>
<span class="w"> </span><span class="nv">zahl4</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">zahl1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nv">zahl2</span>
<span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nv">text</span><span class="p">)</span>
<span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">tabelle</span><span class="w"> </span><span class="o">~=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="kr">then</span>
<span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nv">tabelle</span><span class="p">.</span><span class="py">eintrag</span><span class="p">)</span>
<span class="w"> </span><span class="kr">end</span>
<span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="nv">zahl3</span><span class="p">,</span><span class="nv">zahl4</span>
<span class="kr">end</span>
<span class="nf">probe</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="mi">20</span><span class="p">,</span><span class="w"> </span><span class="s2">"Hallo "</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="nv">eintrag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Welt"</span><span class="p">})</span><span class="w"> </span><span class="c1">-- erlaubter Funktionsaufruf</span>
<span class="nv">x</span><span class="p">,</span><span class="nv">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">probe</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">20</span><span class="p">)</span><span class="w"> </span><span class="c1">-- ebenfalls erlaubter Aufruf, text und tabelle sind nil.</span>
</pre></div>
<p>Beim Aufruf der Funktion müssen nicht alle Variablen übergeben werden. Fehlende Parameter besitzen automatisch den <a href="Nullwert" title="Nullwert">Nullwert</a> <code>nil</code>. Dasselbe gilt für Rückgabewerte. Dadurch lassen sich Funktionsüberladungen einfacher implementieren, das Vorkommen von Laufzeitfehlern steigt jedoch.
</p>
<div class="mw-heading mw-heading3"><h3 id="Reservierte_Schlüsselwörter"><span id="Reservierte_Schl.C3.BCsselw.C3.B6rter"></span>Reservierte Schlüsselwörter</h3></div>
<div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre><span></span>and break do else elseif end false for function goto if in
local nil not or repeat return then true until while
</pre></div>
<p>Das Schlüsselwort <code>nil</code> steht (neben <i>false</i>) für <i>falsch</i> und generell für nicht initialisierte Variablen oder nicht interpretierbare Werte.
</p>
<div class="mw-heading mw-heading3"><h3 id="Beispielcode">Beispielcode</h3></div>
<p>Das klassische <a href="Hallo-Welt-Programm" title="Hallo-Welt-Programm">Hallo-Welt-Programm</a> sieht wie folgt aus:
</p>
<div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="s2">"Hallo Welt!"</span><span class="p">)</span>
</pre></div>
<p><a href="Kommentar_(Programmierung)" title="Kommentar (Programmierung)">Kommentare</a> können einzeilig sowie mehrzeilig verfasst werden:
</p>
<div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">-- Ein Kommentar in Lua beginnt mit zwei Bindestrichen und geht bis zum Ende der Zeile.</span>
<span class="cm">--[[Kommentare können auch über mehrere</span>
<span class="cm"> Zeilen ausgeweitet werden, sodass die Dokumentation</span>
<span class="cm"> des Quellcodes leichter fällt.]]</span>
</pre></div>
<p>Beispiel für eine <a href="Rekursion" title="Rekursion">Rekursion</a> (Berechnung der <a href="Fakult%C3%A4t_(Mathematik)" title="Fakultät (Mathematik)">Fakultät</a>):
</p>
<div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">function</span><span class="w"> </span><span class="nf">factorial</span><span class="p">(</span><span class="nv">n</span><span class="p">)</span>
<span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">n</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="kr">then</span>
<span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
<span class="w"> </span><span class="kr">end</span>
<span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="nv">n</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="nf">factorial</span><span class="p">(</span><span class="nv">n</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span>
<span class="kr">end</span>
</pre></div>
<p>Mit den <a href="Kurzschlussauswertung" title="Kurzschlussauswertung">Kurzschlussoperatoren</a> „and“ und „or“ kann die Funktion kürzer so geschrieben werden (dies entspricht dem <a href="Bedingte_Anweisung_und_Verzweigung#Auswahloperator" title="Bedingte Anweisung und Verzweigung">Auswahloperator</a> ?: von <a href="Programmiersprache_C" class="mw-redirect" title="Programmiersprache C">C</a> und verwandten Sprachen):
</p>
<div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">function</span><span class="w"> </span><span class="nf">factorial</span><span class="p">(</span><span class="nv">n</span><span class="p">)</span>
<span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="nv">n</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="nv">n</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="nf">factorial</span><span class="p">(</span><span class="nv">n</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span>
<span class="kr">end</span>
</pre></div>
<p>Funktionen gelten in Lua als <a href="First-Class-Objekt" title="First-Class-Objekt">First-Class-Objekte</a>. Das bedeutet insbesondere, dass Funktionen während der Laufzeit dynamisch erzeugt und (auch vorhandenen) Variablen zugewiesen werden können. Das folgende Beispiel zeigt, wie die Variable <code>print</code> (welche auf eine Standardfunktion der Lua-Bibliothek zeigt) mit einer anderen Funktion überschrieben wird:
</p>
<div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">do</span>
<span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">oldprint</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">print</span><span class="w"> </span><span class="c1">-- aktuelle (globale) print-Funktion über oldprint zugreifbar machen</span>
<span class="w"> </span><span class="kr">function</span><span class="w"> </span><span class="nf">print</span><span class="p">(</span><span class="nv">s</span><span class="p">)</span><span class="w"> </span><span class="c1">-- Neue (globale) Definition von print, ...</span>
<span class="w"> </span><span class="nf">oldprint</span><span class="p">(</span><span class="s2">"I say: "</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">s</span><span class="p">)</span><span class="w"> </span><span class="c1">-- ... die die alte print-Funktion aufruft.</span>
<span class="w"> </span><span class="kr">end</span>
<span class="kr">end</span>
</pre></div>
<p>Befehle in Lua können mit einem <a href="Semikolon" title="Semikolon">Semikolon</a> abgeschlossen werden. Falls mehrere Befehle in einer Zeile stehen, erleichtert dies die Lesbarkeit des Codes.
</p><p>Die Syntax lehnt sich an die von <a href="Pascal_(Programmiersprache)" title="Pascal (Programmiersprache)">Pascal</a> an, was besonders Anfängern den Einstieg in Lua erleichtert. Im Gegensatz zu von Pascal abgeleiteten Sprachen nutzt Lua jedoch „==“ und nicht „=“ als <a href="Vergleichsoperator" title="Vergleichsoperator">Vergleichsoperator</a>, „=“ als Zuweisungsoperator (anstelle von „:=“ in Pascal) und „~=“ für ungleich (anstelle von „<>“).
</p>
<div class="mw-heading mw-heading2"><h2 id="Module">Module</h2></div>
<p>Lua ist durch benutzerdefinierte Module beliebig erweiterbar. Um diese zu verwalten, ist der in Lua geschriebene Paketverwalter <i>LuaRocks</i> verfügbar.
</p><p>Eine Liste mit verbreiteten Lua-Modulen:
</p>
<table class="wikitable">
<tbody><tr>
<th>Modul</th>
<th>Beschreibung
</th></tr>
<tr>
<td>LuaFileSystem</td>
<td>Zugriff auf Ordnerstrukturen und Dateieigenschaften.
</td></tr>
<tr>
<td>LuaDoc</td>
<td>Dokumentationstool für Lua-Quellcode.
</td></tr>
<tr>
<td>LuaSocket</td>
<td>Bibliothek für Socketprogrammierung.
</td></tr>
<tr>
<td>LuaSQL</td>
<td>Lua-Interface für <a href="PostgreSQL" title="PostgreSQL">PostgreSQL</a>, <a href="Open_Database_Connectivity" title="Open Database Connectivity">ODBC</a>, <a href="MySQL" title="MySQL">MySQL</a>, <a href="SQLite" title="SQLite">SQLite</a>, <a href="Oracle" title="Oracle">Oracle</a>, und <a href="OLE_DB" title="OLE DB">OLE DB</a>.
</td></tr>
<tr>
<td>stdlib</td>
<td>Bibliothek für häufige Programmieraufgaben; bezieht sich auf Listen, Tabellen, funktionale Programmierung, <a href="Regul%C3%A4rer_Ausdruck" title="Regulärer Ausdruck">Reguläre Ausdrücke</a>, Objekte, <a href="Quelltextformatierung" title="Quelltextformatierung">Pretty-Printing</a> und getopt.
</td></tr>
<tr>
<td><a href="Message-Digest_Algorithm_5" title="Message-Digest Algorithm 5">MD5</a></td>
<td>einfache <a href="Kryptografische_Hashfunktion" class="mw-redirect" title="Kryptografische Hashfunktion">kryptografische Hashfunktion</a>
</td></tr>
<tr>
<td>Copas</td>
<td>Dispatcher, basierend auf Co-Routinen, der von <a href="TCP/IP" class="mw-redirect" title="TCP/IP">TCP/IP</a>-Servern verwendet werden kann.
</td></tr>
<tr>
<td>LuaZip</td>
<td>Bibliothek, die von <a href="ZIP-Dateiformat" title="ZIP-Dateiformat">ZIP-Dateien</a> lesen kann.
</td></tr>
<tr>
<td>LuaInterface</td>
<td>Verbindung zwischen Lua und <a href="Microsoft" title="Microsoft">Microsofts</a> <a href=".Net-Framework" title=".Net-Framework">.Net-Framework</a> <a href="Common_Language_Runtime" title="Common Language Runtime">Common Language Runtime</a> (CLR).
</td></tr>
<tr>
<td>LuaBitOps</td>
<td>Eine auf <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a> basierende Erweiterung für Lua für bitweise Operationen von Zahlen.
</td></tr>
<tr>
<td>LuaXML</td>
<td>Einfache Verbindung zwischen <a href="Extensible_Markup_Language" title="Extensible Markup Language">XML</a> und Lua.
</td></tr>
<tr>
<td>Lanes</td>
<td>Ermöglicht die <a href="Nebenl%C3%A4ufigkeit" title="Nebenläufigkeit">parallele Ausführung</a> von verschiedenen Lua-Umgebungen.
</td></tr>
<tr>
<td>Penlight</td>
<td>Bibliothek, die den Umgang mit Tabellen, <a href="Feld_(Datentyp)" class="mw-redirect" title="Feld (Datentyp)">Arrays</a>, Strings, Dateipfaden, Ordnern, Daten und funktionalen Programmieranwendungen vereinfacht.
</td></tr>
<tr>
<td>Oil</td>
<td>Einfacher und effizienter Object Request Broker (<a href="Common_Object_Request_Broker_Architecture" title="Common Object Request Broker Architecture">CORBA</a>).
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Roberto Ierusalimschy: <i>Programmieren in Lua</i>, 4. Auflage, Open Source Press, 2016, ISBN 978-85-903798-6-7.</li>
<li>Roberto Ierusalimschy, L. H. Figueiredo, W. Celes: <i>Lua 5.1 Reference Manual</i>, August 2006, ISBN 85-903798-3-3.</li>
<li>Kurt Jung, Aaron Brown: <i>Beginning Lua Programming</i>, Wrox, 2007, ISBN 0-470-06917-1.</li>
<li>Claus Kühnel, Daniel Zwirner: <i>Lua: Einsatz von Lua in Embedded Systems</i>, 2. Auflage, Skript Verlag Kühnel, 2012, ISBN 978-3-907857-15-1.</li>
<li>David Young: <i>Learning Game AI Programming with Lua</i>, Packt Publishing, 2014, ISBN 1-78328-133-2.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<div class="sisterproject" style="margin:0.1em 0 0 0;"><div class="noresize noviewer" style="display:inline-block; line-height:10px; min-width:1.6em; text-align:center;" aria-hidden="true" role="presentation"><span class="mw-default-size" typeof="mw:File"><span title="Commons"></span></span></div><b><span class=""><a class="external text" href="https://commons.wikimedia.org/wiki/Category:Lua_(programming_language)?uselang=de"><span lang="en">Commons</span>: Lua</a></span></b> – Sammlung von Bildern, Videos und Audiodateien</div>
<ul><li><a rel="nofollow" class="external text" href="https://www.lua.org/">Lua.org</a> – offizielle Website (englisch und portugiesisch)</li>
<li><a rel="nofollow" class="external text" href="https://www.luafaq.org/">Lua Unofficial FAQ</a></li>
<li><a rel="nofollow" class="external text" href="https://luarocks.org/">LuaRocks</a> – Paketmanager und -repository</li>
<li><a rel="nofollow" class="external text" href="http://lua-users.org/wiki/">Lua Users Wiki</a></li>
<li><a rel="nofollow" class="external text" href="https://github.com/LewisJEllis/awesome-lua">Awesome Lua</a> auf GitHub</li>
<li><a rel="nofollow" class="external text" href="http://tylerneylon.com/a/learn-lua/">Learn Lua in 15 Minutes</a></li>
<li><a rel="nofollow" class="external text" href="https://intern.fh-wedel.de/~si/seminare/ws09/Ausarbeitung/09.lua/lua0.htm">Schnelles, leichtgewichtiges, eingebettetes Scripting mit Lua</a> von Jan Bornholdt, <a href="Fachhochschule_Wedel" title="Fachhochschule Wedel">Fachhochschule Wedel</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Quellen_und_Anmerkungen">Quellen und Anmerkungen</h2></div>
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-_a8e36a3f095fbfbe-1"><span class="mw-cite-backlink"><a href="#cite_ref-_a8e36a3f095fbfbe_1-0">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://lua.org/versions.html#5.5"><cite style="font-style:italic">lua.org</cite>.</a></span>
</li>
<li id="cite_note-LuaJIT-2"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-LuaJIT_2-0">a</a></sup> <sup><a href="#cite_ref-LuaJIT_2-1">b</a></sup></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://luajit.org/"><i>LuaJIT.</i></a><span class="Abrufdatum"> Abgerufen am 26. Februar 2017</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3ALua&rft.title=LuaJIT&rft.description=LuaJIT&rft.identifier=https%3A%2F%2Fluajit.org%2F&rft.language=en"> </span></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://github.com/neopallium/llvm-lua"><i>LLVM-Lua.</i></a><span class="Abrufdatum"> Abgerufen am 26. Februar 2017</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3ALua&rft.title=LLVM-Lua&rft.description=LLVM-Lua&rft.identifier=https%3A%2F%2Fgithub.com%2Fneopallium%2Fllvm-lua&rft.language=en"> </span></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://github.com/mascarenhas/luaclr"><i>LuaCLR.</i></a><span class="Abrufdatum"> Abgerufen am 3. Januar 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3ALua&rft.title=LuaCLR&rft.description=LuaCLR&rft.identifier=https%3A%2F%2Fgithub.com%2Fmascarenhas%2Fluaclr&rft.language=en"> </span></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text">Julien Danjou: <a rel="nofollow" class="external text" href="https://julien.danjou.info/why-not-lua/"><i>Why not Lua</i></a>, abgerufen am 19. Juni 2021.</span>
</li>
</ol></div>
<div class="hintergrundfarbe1 rahmenfarbe1 navigation-not-searchable normdaten-typ-s" style="border-style: solid; border-width: 1px; clear: left; margin-bottom:1em; margin-top:1em; padding: 0.25em; overflow: hidden; word-break: break-word; word-wrap: break-word;" id="normdaten">
<div style="display: table-cell; vertical-align: middle; width: 100%;">
<div>
Normdaten (Sachbegriff): <a href="Gemeinsame_Normdatei" title="Gemeinsame Normdatei">GND</a>: <span class="-print"><a rel="nofollow" class="external text" href="https://d-nb.info/gnd/7547043-3">7547043-3</a></span> </div>
</div></div></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-08-21" href="https://de.wikipedia.org/wiki/?title=Lua&oldid=259070329">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>